package com.wgh.demo.ai.service.impl;

import com.wgh.demo.ai.config.AiModelConfig;
import com.wgh.demo.ai.enums.AiModelType;
import com.wgh.demo.ai.service.AiModelService;
import com.wgh.demo.ai.service.ModelDecisionService;
import com.wgh.demo.ai.service.impl.AlibabaAiModelServiceImpl;
import com.wgh.demo.ai.service.impl.DeepSeekAiModelServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class ModelDecisionServiceImpl implements ModelDecisionService {
    private static final Logger logger = LoggerFactory.getLogger(ModelDecisionServiceImpl.class);

    /**
     * 用于决策的基础模型，这里使用默认模型
     */
    private final AiModelService baseDecisionModel;

    @Autowired
    public ModelDecisionServiceImpl(AlibabaAiModelServiceImpl alibabaAiModelService,
                                   DeepSeekAiModelServiceImpl deepSeekAiModelService,
                                   AiModelConfig aiModelConfig) {
        // 根据配置选择默认模型
        String defaultModelName = aiModelConfig.getDefaultModel();
        if (AiModelType.DEEPSEEK.getCode().equals(defaultModelName)) {
            this.baseDecisionModel = deepSeekAiModelService;
        } else {
            // 默认使用alibaba模型
            this.baseDecisionModel = alibabaAiModelService;
        }
        logger.info("初始化模型决策服务，使用基础模型: {}", baseDecisionModel.getModelName());
    }

    @Override
    public Mono<String> decideModel(String prompt) {
        // 准备决策提示
        String decisionPrompt = buildDecisionPrompt(prompt);

        // 使用基础模型生成决策
        return baseDecisionModel.generateText(decisionPrompt)
                .map(this::parseDecisionResult)
                .onErrorResume(e -> {
                    logger.error("模型决策失败: {}", e.getMessage(), e);
                    // 出错时返回基础模型名称
                    return Mono.just(baseDecisionModel.getModelName());
                });
    }

    /**
     * 构建决策提示
     */
    private String buildDecisionPrompt(String userPrompt) {
        return "你需要分析用户的输入内容，并决定应该使用哪个AI模型来回答。\n" +
               "可用模型：\n" +
               "1. alibaba：适合中文内容，特别是需要理解中国文化、中文语境的情况\n" +
               "2. deepseek：适合英文内容和技术类问题\n" +
               "请根据用户输入的内容特点，选择最合适的模型。\n" +
               "用户输入：\"" + userPrompt + "\"\n" +
               "请仅返回模型名称，不要添加任何解释或其他文字。";    
    }

    /**
     * 解析决策结果
     */
    private String parseDecisionResult(String decisionResult) {
        logger.info("模型决策结果原始内容: {}", decisionResult);

        // 提取模型名称
        String modelName = decisionResult.trim().toLowerCase();

        // 验证模型是否可用
        if (AiModelType.ALIBABA.getCode().contains(modelName)) {
            return AiModelType.ALIBABA.getCode();
        } else if (AiModelType.DEEPSEEK.getCode().contains(modelName)) {
            return AiModelType.DEEPSEEK.getCode();
        } else {
            logger.warn("无法识别的模型决策结果: {}, 使用基础模型", decisionResult);
            return baseDecisionModel.getModelName();
        }
    }
}